μννΈμ¨μ΄ κ°λ°μμ νμ μμ κ°μ²΄ μμ±μ μν μ λ€λ¦ ν©ν 리 ν¨ν΄μ νμν©λλ€. μ½λ μ μ§ κ΄λ¦¬μ±μ ν₯μμν€κ³ μ€λ₯λ₯Ό μ€μ΄λ©° μ λ°μ μΈ λμμΈμ κ°μ νλ λ°©λ²μ μμλ΄ λλ€. μ€μ©μ μΈ μμ ν¬ν¨.
μ λ€λ¦ ν©ν 리 ν¨ν΄: κ°μ²΄ μμ± μ νμ μμ μ± ν보
ν©ν 리 ν¨ν΄μ ꡬ체μ μΈ ν΄λμ€λ₯Ό μ§μ νμ§ μκ³ κ°μ²΄λ₯Ό μμ±νκΈ° μν μΈν°νμ΄μ€λ₯Ό μ 곡νλ μμ± λμμΈ ν¨ν΄μ λλ€. μ΄λ₯Ό ν΅ν΄ ν΄λΌμ΄μΈνΈ μ½λλ₯Ό κ°μ²΄ μμ± νλ‘μΈμ€μ λΆλ¦¬νμ¬ μ½λλ₯Ό λμ± μ μ°νκ³ μ μ§ κ΄λ¦¬νκΈ° μ½κ² λ§λ€ μ μμ΅λλ€. κ·Έλ¬λ κΈ°μ‘΄ ν©ν 리 ν¨ν΄μ λλλ‘ νμ μμ μ±μ΄ λΆμ‘±νμ¬ λ°νμ μ€λ₯κ° λ°μν μ μμ΅λλ€. μ λ€λ¦ ν©ν 리 ν¨ν΄μ μ λ€λ¦μ νμ©νμ¬ νμ μμ κ°μ²΄ μμ±μ 보μ₯ν¨μΌλ‘μ¨ μ΄λ¬ν μ ν μ¬νμ ν΄κ²°ν©λλ€.
μ λ€λ¦ ν©ν 리 ν¨ν΄μ΄λ 무μμ λκΉ?
μ λ€λ¦ ν©ν 리 ν¨ν΄μ μ»΄νμΌ μκ°μ νμ μμ μ±μ μ μ©νκΈ° μν΄ μ λ€λ¦μ μ¬μ©νλ νμ€ ν©ν 리 ν¨ν΄μ νμ₯μ λλ€. ν©ν 리μ μν΄ μμ±λ κ°μ²΄κ° μμλλ νμ μ μ€μνλμ§ νμΈνμ¬ λ°νμ μ€μ μκΈ°μΉ μμ μ€λ₯λ₯Ό λ°©μ§ν©λλ€. μ΄λ C#, Java λ° TypeScriptμ κ°μ΄ μ λ€λ¦μ μ§μνλ μΈμ΄μμ νΉν μ μ©ν©λλ€.
μ λ€λ¦ ν©ν 리 ν¨ν΄ μ¬μ©μ μ΄μ
- νμ μμ μ±: μμ±λ κ°μ²΄κ° μ¬λ°λ₯Έ νμ μΈμ§ νμΈνμ¬ λ°νμ μ€λ₯μ μνμ μ€μ λλ€.
- μ½λ μ μ§ κ΄λ¦¬μ±: κ°μ²΄ μμ±μ ν΄λΌμ΄μΈνΈ μ½λμμ λΆλ¦¬νμ¬ ν΄λΌμ΄μΈνΈμ μν₯μ μ£Όμ§ μκ³ ν©ν 리λ₯Ό μμ νκ±°λ νμ₯νκΈ° μ½κ² λ§λλλ€.
- μ μ°μ±: λμΌν μΈν°νμ΄μ€ λλ μΆμ ν΄λμ€μ λ€λ₯Έ ꡬν κ°μ μ½κ² μ νν μ μμ΅λλ€.
- 보μΌλ¬νλ μ΄νΈ κ°μ: ν©ν 리 λ΄μ μΊ‘μννμ¬ κ°μ²΄ μμ± λ‘μ§μ λ¨μνν μ μμ΅λλ€.
- ν₯μλ ν μ€νΈ μ©μ΄μ±: ν©ν 리λ₯Ό μ½κ² λͺ¨μ λλ μ€ν ν μ μλλ‘ νμ¬ λ¨μ ν μ€νΈλ₯Ό μ©μ΄νκ² ν©λλ€.
μ λ€λ¦ ν©ν 리 ν¨ν΄ ꡬν
μ λ€λ¦ ν©ν 리 ν¨ν΄μ ꡬνμλ μΌλ°μ μΌλ‘ μμ±ν κ°μ²΄μ λν μΈν°νμ΄μ€ λλ μΆμ ν΄λμ€λ₯Ό μ μν λ€μ μ λ€λ¦μ μ¬μ©νμ¬ νμ μμ μ±μ 보μ₯νλ ν©ν 리 ν΄λμ€λ₯Ό λ§λλ κ²μ΄ ν¬ν¨λ©λλ€. λ€μμ C#, Java λ° TypeScriptμ μμ λλ€.
C# μμ
κ΅¬μ± μ€μ μ κΈ°λ°μΌλ‘ λ€μν νμ μ λ‘κ±°λ₯Ό μμ±ν΄μΌ νλ μλ리μ€λ₯Ό κ³ λ €νμμμ€.
// λ‘κ±°μ λν μΈν°νμ΄μ€ μ μ
public interface ILogger
{
void Log(string message);
}
// λ‘κ±°μ ꡬ체μ μΈ κ΅¬ν
public class ConsoleLogger : ILogger
{
public void Log(string message)
{
Console.WriteLine($"Console: {message}");
}
}
public class FileLogger : ILogger
{
private readonly string _filePath;
public FileLogger(string filePath)
{
_filePath = filePath;
}
public void Log(string message)
{
File.AppendAllText(_filePath, $"{DateTime.Now}: {message}\n");
}
}
// μ λ€λ¦ ν©ν 리 μΈν°νμ΄μ€
public interface ILoggerFactory
{
T CreateLogger<T>() where T : ILogger;
}
// ꡬ체μ μΈ ν©ν 리 ꡬν
public class LoggerFactory : ILoggerFactory
{
public T CreateLogger<T>() where T : ILogger
{
if (typeof(T) == typeof(ConsoleLogger))
{
return (T)(ILogger)new ConsoleLogger();
}
else if (typeof(T) == typeof(FileLogger))
{
// μ΄μμ μΌλ‘λ ꡬμ±μμ νμΌ κ²½λ‘λ₯Ό μ½μ΅λλ€.
return (T)(ILogger)new FileLogger("log.txt");
}
else
{
throw new ArgumentException($"μ§μλμ§ μλ λ‘κ±° νμ
: {typeof(T).Name}");";
}
}
}
// μ¬μ©λ²
public class MyApplication
{
private readonly ILogger _logger;
public MyApplication(ILoggerFactory loggerFactory)
{
_logger = loggerFactory.CreateLogger<ConsoleLogger>();
}
public void DoSomething()
{
_logger.Log("Doing something...");
}
}
μ΄ C# μμ μμ ILoggerFactory μΈν°νμ΄μ€μ LoggerFactory ν΄λμ€λ μ λ€λ¦μ μ¬μ©νμ¬ CreateLogger λ©μλκ° μ¬λ°λ₯Έ νμ
μ κ°μ²΄λ₯Ό λ°ννλλ‘ λ³΄μ₯ν©λλ€. where T : ILogger μ μ½ μ‘°κ±΄μ ILogger μΈν°νμ΄μ€λ₯Ό ꡬννλ ν΄λμ€λ§ ν©ν 리μμ μμ±ν μ μλλ‘ λ³΄μ₯ν©λλ€.
Java μμ
λ€μμ λ€μν νμ μ λνμ μμ±νκΈ° μν μ λ€λ¦ ν©ν 리 ν¨ν΄μ Java ꡬνμ λλ€.
// λνμ λν μΈν°νμ΄μ€ μ μ
interface Shape {
void draw();
}
// λνμ ꡬ체μ μΈ κ΅¬ν
class Circle implements Shape {
@Override
public void draw() {
System.out.println("Drawing a circle");
}
}
class Square implements Shape {
@Override
public void draw() {
System.out.println("Drawing a square");
}
}
// μ λ€λ¦ ν©ν 리 μΈν°νμ΄μ€
interface ShapeFactory {
<T extends Shape> T createShape(Class<T> shapeType);
}
// ꡬ체μ μΈ ν©ν 리 ꡬν
class DefaultShapeFactory implements ShapeFactory {
@Override
public <T extends Shape> T createShape(Class<T> shapeType) {
try {
return shapeType.getDeclaredConstructor().newInstance();
} catch (Exception e) {
throw new IllegalArgumentException("Cannot create shape of type: " + shapeType.getName(), e);
}
}
}
// μ¬μ©λ²
public class Main {
public static void main(String[] args) {
ShapeFactory factory = new DefaultShapeFactory();
Circle circle = factory.createShape(Circle.class);
circle.draw();
Square square = factory.createShape(Square.class);
square.draw();
}
}
μ΄ Java μμ μμ ShapeFactory μΈν°νμ΄μ€μ DefaultShapeFactory ν΄λμ€λ μ λ€λ¦μ μ¬μ©νμ¬ ν΄λΌμ΄μΈνΈκ° μμ±ν Shapeμ μ νν νμ
μ μ§μ ν μ μλλ‘ ν©λλ€. Class<T> λ° λ¦¬νλ μ
μ μ¬μ©μ ν©ν 리 μ체μμ κ° ν΄λμ€μ λν΄ λͺ
μμ μΌλ‘ μ νμ μμ΄ λ€μν λν νμ
μ μΈμ€ν΄μ€ννλ μ μ°ν λ°©λ²μ μ 곡ν©λλ€.
TypeScript μμ
λ€μμ λ€μν νμ μ μλ¦Όμ μμ±νκΈ° μν TypeScript ꡬνμ λλ€.
// μλ¦Όμ λν μΈν°νμ΄μ€ μ μ
interface INotification {
send(message: string): void;
}
// μλ¦Όμ ꡬ체μ μΈ κ΅¬ν
class EmailNotification implements INotification {
private readonly emailAddress: string;
constructor(emailAddress: string) {
this.emailAddress = emailAddress;
}
send(message: string): void {
console.log(`Sending email to ${this.emailAddress}: ${message}`);
}
}
class SMSNotification implements INotification {
private readonly phoneNumber: string;
constructor(phoneNumber: string) {
this.phoneNumber = phoneNumber;
}
send(message: string): void {
console.log(`Sending SMS to ${this.phoneNumber}: ${message}`);
}
}
// μ λ€λ¦ ν©ν 리 μΈν°νμ΄μ€
interface INotificationFactory {
createNotification<T extends INotification>(): T;
}
// ꡬ체μ μΈ ν©ν 리 ꡬν
class NotificationFactory implements INotificationFactory {
createNotification<T extends INotification>(): T {
if (typeof T === typeof EmailNotification) {
return new EmailNotification("test@example.com") as T;
} else if (typeof T === typeof SMSNotification) {
return new SMSNotification("+15551234567") as T;
} else {
throw new Error(`Unsupported notification type: ${typeof T}`);
}
}
}
// μ¬μ©λ²
const factory = new NotificationFactory();
const emailNotification = factory.createNotification<EmailNotification>();
emailNotification.send("Hello from email!");
const smsNotification = factory.createNotification<SMSNotification>();
smsNotification.send("Hello from SMS!");
μ΄ TypeScript μμ μμ INotificationFactory μΈν°νμ΄μ€μ NotificationFactory ν΄λμ€λ μ λ€λ¦μ μ¬μ©νμ¬ ν΄λΌμ΄μΈνΈκ° μμ±ν INotificationμ μ νν νμ
μ μ§μ ν μ μλλ‘ ν©λλ€. ν©ν 리λ INotification μΈν°νμ΄μ€λ₯Ό ꡬννλ ν΄λμ€μ μΈμ€ν΄μ€λ§ μμ±νμ¬ νμ
μμ μ±μ 보μ₯ν©λλ€. typeof Tλ₯Ό λΉκ΅μ μ¬μ©νλ κ²μ μΌλ°μ μΈ TypeScript ν¨ν΄μ
λλ€.
μ λ€λ¦ ν©ν 리 ν¨ν΄μ μ¬μ©ν΄μΌ νλ κ²½μ°
μ λ€λ¦ ν©ν 리 ν¨ν΄μ λ€μκ³Ό κ°μ μλ리μ€μμ νΉν μ μ©ν©λλ€.
- λ°νμ 쑰건μ λ°λΌ λ€μν νμ μ κ°μ²΄λ₯Ό μμ±ν΄μΌ νλ κ²½μ°.
- κ°μ²΄ μμ±μ ν΄λΌμ΄μΈνΈ μ½λμμ λΆλ¦¬νλ €λ κ²½μ°.
- λ°νμ μ€λ₯λ₯Ό λ°©μ§νκΈ° μν΄ μ»΄νμΌ μκ° νμ μμ μ±μ΄ νμν κ²½μ°.
- λμΌν μΈν°νμ΄μ€ λλ μΆμ ν΄λμ€μ λ€λ₯Έ ꡬν κ°μ μ½κ² μ νν΄μΌ νλ κ²½μ°.
- C#, Java λλ TypeScriptμ κ°μ΄ μ λ€λ¦μ μ§μνλ μΈμ΄λ‘ μμ νλ κ²½μ°.
μΌλ°μ μΈ ν¨μ κ³Ό κ³ λ € μ¬ν
- κ³Όλν μμ§λμ΄λ§: κ°λ¨ν κ°μ²΄ μμ±μΌλ‘ μΆ©λΆν κ²½μ° ν©ν 리 ν¨ν΄μ μ¬μ©νμ§ λ§μμμ€. λμμΈ ν¨ν΄μ κ³Όλνκ² μ¬μ©νλ©΄ λΆνμν 볡μ‘μ±μ΄ λ°μν μ μμ΅λλ€.
- ν©ν 리 볡μ‘μ±: κ°μ²΄ νμ μ μκ° μ¦κ°ν¨μ λ°λΌ ν©ν 리 ꡬνμ΄ λ³΅μ‘ν΄μ§ μ μμ΅λλ€. 볡μ‘μ±μ κ΄λ¦¬νκΈ° μν΄ μΆμ ν©ν 리 ν¨ν΄κ³Ό κ°μ κ³ κΈ ν©ν 리 ν¨ν΄μ μ¬μ©νλ κ²μ κ³ λ €νμμμ€.
- 리νλ μ μ€λ²ν€λ (Java): Javaμμ 리νλ μ μ μ¬μ©νμ¬ κ°μ²΄λ₯Ό μμ±νλ©΄ μ±λ₯ μ€λ²ν€λκ° λ°μν μ μμ΅λλ€. μμ±λ μΈμ€ν΄μ€λ₯Ό μΊμνκ±°λ μ±λ₯μ΄ μ€μν μ ν리μΌμ΄μ μ κ²½μ° λ€λ₯Έ κ°μ²΄ μμ± λ©μ»€λμ¦μ μ¬μ©νλ κ²μ κ³ λ €νμμμ€.
- ꡬμ±: μμ±ν κ°μ²΄ νμ μ ꡬμ±μ μΈλΆννλ κ²μ κ³ λ €νμμμ€. μ΄λ κ² νλ©΄ μ½λλ₯Ό μμ νμ§ μκ³ λ κ°μ²΄ μμ± λ‘μ§μ λ³κ²½ν μ μμ΅λλ€. μλ₯Ό λ€μ΄ μμ± νμΌμμ ν΄λμ€ μ΄λ¦μ μ½μ μ μμ΅λλ€.
- μ€λ₯ μ²λ¦¬: κ°μ²΄ μμ±μ μ€ν¨νλ κ²½μ°λ₯Ό μ μμ μΌλ‘ μ²λ¦¬νκΈ° μν΄ ν©ν 리 λ΄μμ μ μ ν μ€λ₯ μ²λ¦¬λ₯Ό 보μ₯νμμμ€. λλ²κΉ μ λμμ΄ λλλ‘ μ μ©ν μ€λ₯ λ©μμ§λ₯Ό μ 곡νμμμ€.
μ λ€λ¦ ν©ν 리 ν¨ν΄μ λμ
μ λ€λ¦ ν©ν 리 ν¨ν΄μ κ°λ ₯ν λꡬμ΄μ§λ§ νΉμ μν©μμ λ μ ν©ν μ μλ κ°μ²΄ μμ±μ λν λ체 μ κ·Ό λ°©μμ΄ μμ΅λλ€.
- μ’ μμ± μ£Όμ (DI): DI νλ μμν¬λ κ°μ²΄ μμ± λ° μ’ μμ±μ κ΄λ¦¬νμ¬ λͺ μμ ν©ν 리μ νμμ±μ μ€μΌ μ μμ΅λλ€. DIλ ν¬κ³ 볡μ‘ν μ ν리μΌμ΄μ μμ νΉν μ μ©ν©λλ€. Spring (Java), .NET DI Container (C#) λ° Angular (TypeScript)μ κ°μ νλ μμν¬λ κ°λ ₯ν DI κΈ°λ₯μ μ 곡ν©λλ€.
- μΆμ ν©ν 리 ν¨ν΄: μΆμ ν©ν 리 ν¨ν΄μ ꡬ체μ μΈ ν΄λμ€λ₯Ό μ§μ νμ§ μκ³ κ΄λ ¨ κ°μ²΄ ν¨λ°λ¦¬λ₯Ό μμ±νκΈ° μν μΈν°νμ΄μ€λ₯Ό μ 곡ν©λλ€. μ΄λ μΌκ΄λ μ ν ν¨λ°λ¦¬μ μΌλΆμΈ μ¬λ¬ κ΄λ ¨ κ°μ²΄λ₯Ό μμ±ν΄μΌ νλ κ²½μ°μ μ μ©ν©λλ€.
- λΉλ ν¨ν΄: λΉλ ν¨ν΄μ 볡μ‘ν κ°μ²΄μ ꡬμ±μ ν΄λΉ ννμμ λΆλ¦¬νμ¬ λμΌν κ΅¬μ± νλ‘μΈμ€λ₯Ό μ¬μ©νμ¬ λμΌν κ°μ²΄μ λ€λ₯Έ ννμ λ§λ€ μ μλλ‘ ν©λλ€.
- νλ‘ν νμ ν¨ν΄: νλ‘ν νμ ν¨ν΄μ μ¬μ©νλ©΄ κΈ°μ‘΄ κ°μ²΄ (νλ‘ν νμ )λ₯Ό 볡μ¬νμ¬ μ κ°μ²΄λ₯Ό λ§λ€ μ μμ΅λλ€. μ΄λ μ κ°μ²΄λ₯Ό λ§λλ λ° λΉμ©μ΄ λ§μ΄ λ€κ±°λ 볡μ‘ν κ²½μ°μ μ μ©ν©λλ€.
μ€μ μμ
- λ°μ΄ν°λ² μ΄μ€ μ°κ²° ν©ν 리: κ΅¬μ± μ€μ μ κΈ°λ°μΌλ‘ λ€μν νμ μ λ°μ΄ν°λ² μ΄μ€ μ°κ²° (μ: MySQL, PostgreSQL, Oracle)μ μμ±ν©λλ€.
- κ²°μ κ²μ΄νΈμ¨μ΄ ν©ν 리: μ νν κ²°μ λ°©λ²μ κΈ°λ°μΌλ‘ λ€μν κ²°μ κ²μ΄νΈμ¨μ΄ ꡬν (μ: PayPal, Stripe, Visa)μ μμ±ν©λλ€.
- UI μμ ν©ν 리: μ¬μ©μ μΈν°νμ΄μ€ ν λ§ λλ νλ«νΌμ κΈ°λ°μΌλ‘ λ€μν UI μμ (μ: λ²νΌ, ν μ€νΈ νλ, λ μ΄λΈ)λ₯Ό μμ±ν©λλ€.
- λ³΄κ³ μ ν©ν 리: μ νν νμμ κΈ°λ°μΌλ‘ λ€μν νμ μ λ³΄κ³ μ (μ: PDF, Excel, CSV)λ₯Ό μμ±ν©λλ€.
μ΄λ¬ν μλ λ°μ΄ν° μ‘μΈμ€μμ μ¬μ©μ μΈν°νμ΄μ€ κ°λ°μ μ΄λ₯΄κΈ°κΉμ§ λ€μν λλ©μΈμμ μ λ€λ¦ ν©ν 리 ν¨ν΄μ λ€μ¬λ€λ₯ν¨μ 보μ¬μ€λλ€.
κ²°λ‘
μ λ€λ¦ ν©ν 리 ν¨ν΄μ μννΈμ¨μ΄ κ°λ°μμ νμ μμ κ°μ²΄ μμ±μ λ¬μ±νκΈ° μν κ·μ€ν λꡬμ λλ€. μ λ€λ¦μ νμ©νμ¬ ν©ν 리μ μν΄ μμ±λ κ°μ²΄κ° μμλλ νμ μ μ€μνλμ§ νμΈνμ¬ λ°νμ μ€λ₯μ μνμ μ€μ΄κ³ μ½λ μ μ§ κ΄λ¦¬μ±μ ν₯μμν΅λλ€. μ μ¬μ μΈ λ¨μ κ³Ό λμμ κ³ λ €νλ κ²μ΄ νμμ μ΄μ§λ§ μ λ€λ¦ ν©ν 리 ν¨ν΄μ νΉν μ λ€λ¦μ μ§μνλ μΈμ΄λ‘ μμ ν λ μ ν리μΌμ΄μ μ μ€κ³ λ° κ²¬κ³ μ±μ ν¬κ² ν₯μμν¬ μ μμ΅λλ€. νμ λμμΈ ν¨ν΄μ μ΄μ κ³Ό μ½λλ² μ΄μ€μ λ¨μμ± λ° μ μ§ κ΄λ¦¬μ±μ νμμ± κ°μ κ· νμ λ§μΆλ κ²μ μμ§ λ§μμμ€.